{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Tce3stUlHN0L"
      },
      "source": [
        "##### Copyright 2025 Google LLC."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "cellView": "form",
        "id": "tuOe1ymfHZPu"
      },
      "outputs": [],
      "source": [
        "# @title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LmfLXp5_bt-a"
      },
      "source": [
        "# Document search with embeddings"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kIkJ7zgADMlP"
      },
      "source": [
        "<a target=\"_blank\" href=\"https://colab.research.google.com/github/google-gemini/cookbook/blob/main/examples/Talk_to_documents_with_embeddings.ipynb\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" height=30/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "bbf4f2c17530"
      },
      "source": [
        "<!-- Princing warning Badge -->\n",
        "<table>\n",
        "  <tr>\n",
        "    <!-- Emoji -->\n",
        "    <td bgcolor=\"#f5949e\">\n",
        "      <font size=30>⚠️</font>\n",
        "    </td>\n",
        "    <!-- Text Content Cell -->\n",
        "    <td bgcolor=\"#f5949e\">\n",
        "      <h3><font color=black>This notebook requires paid tier rate limits to run properly.<br>  \n",
        "(cf. <a href=\"https://ai.google.dev/pricing#veo2\"><font color='#217bfe'>pricing</font></a> for more details).</font></h3>\n",
        "    </td>\n",
        "  </tr>\n",
        "</table>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "bbPzgYbrwbK2"
      },
      "source": [
        "## Overview\n",
        "\n",
        "This example demonstrates how to use the Gemini API to create embeddings so that you can perform document search. You will use the Python client library to build a word embedding that allows you to compare search strings, or questions, to document contents.\n",
        "\n",
        "In this tutorial, you'll use embeddings to perform document search over a set of documents to ask questions related to the Google Car.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "IS2GUSP0_Eim"
      },
      "source": [
        "## Setup"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "id": "YD6urJjWGVDf"
      },
      "outputs": [],
      "source": [
        "%pip install -U -q \"google-genai>=1.0.0\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DJriBaWmkL6Z"
      },
      "source": [
        "To run the following cell, your API key must be stored it in a Colab Secret named `GOOGLE_API_KEY`. If you don't already have an API key, or you're not sure how to create a Colab Secret, see the [Authentication](https://github.com/google-gemini/cookbook/blob/main/quickstarts/Authentication.ipynb) quickstart for an example."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "JIm3gEGYhTX1"
      },
      "outputs": [],
      "source": [
        "from google import  genai\n",
        "from google.colab import userdata\n",
        "\n",
        "GEMINI_API_KEY=userdata.get('GEMINI_API_KEY')\n",
        "client = genai.Client(api_key=GEMINI_API_KEY)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gGpQ8Eg0kNXW"
      },
      "source": [
        "## Embedding generation\n",
        "\n",
        "In this section, you will see how to generate embeddings for a piece of text using the embeddings from the Gemini API.\n",
        "\n",
        "See the [Embeddings quickstart](https://github.com/google-gemini/cookbook/blob/main/quickstarts/Embeddings.ipynb) to learn more about the `task_type` parameter used below."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "id": "J76TNa3QDwCc"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "embeddings=[ContentEmbedding(\n",
            "  values=[\n",
            "    -0.019380787,\n",
            "    0.015025399,\n",
            "    0.006310311,\n",
            "    -0.057478663,\n",
            "    0.011998727,\n",
            "    <... 3067 more items ...>,\n",
            "  ]\n",
            ")] metadata=None\n"
          ]
        }
      ],
      "source": [
        "from google.genai import types\n",
        "\n",
        "title = \"The next generation of AI for developers and Google Workspace\"\n",
        "sample_text = \"\"\"\n",
        "    Title: The next generation of AI for developers and Google Workspace\n",
        "    Full article:\n",
        "    Gemini API & Google AI Studio: An approachable way to explore and\n",
        "    prototype with generative AI applications\n",
        "\"\"\"\n",
        "\n",
        "EMBEDDING_MODEL_ID = MODEL_ID = \"gemini-embedding-001\"  # @param [\"gemini-embedding-001\", \"text-embedding-004\"] {\"allow-input\": true, \"isTemplate\": true}\n",
        "embedding = client.models.embed_content(\n",
        "        model=EMBEDDING_MODEL_ID,\n",
        "        contents=sample_text,\n",
        "        config=types.EmbedContentConfig(\n",
        "            task_type=\"retrieval_document\",\n",
        "            title=title\n",
        "    ))\n",
        "\n",
        "print(embedding)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dD1lQx3Zr3S2"
      },
      "source": [
        "## Building an embeddings database\n",
        "\n",
        "Here are three sample texts to use to build the embeddings database. You will use the Gemini API to create embeddings of each of the documents. Turn them into a dataframe for better visualization."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "id": "XvLRIbpq4vNN"
      },
      "outputs": [],
      "source": [
        "DOCUMENT1 = {\n",
        "    \"title\": \"Operating the Climate Control System\",\n",
        "    \"content\": \"Your Googlecar has a climate control system that allows you to adjust the temperature and airflow in the car. To operate the climate control system, use the buttons and knobs located on the center console.  Temperature: The temperature knob controls the temperature inside the car. Turn the knob clockwise to increase the temperature or counterclockwise to decrease the temperature. Airflow: The airflow knob controls the amount of airflow inside the car. Turn the knob clockwise to increase the airflow or counterclockwise to decrease the airflow. Fan speed: The fan speed knob controls the speed of the fan. Turn the knob clockwise to increase the fan speed or counterclockwise to decrease the fan speed. Mode: The mode button allows you to select the desired mode. The available modes are: Auto: The car will automatically adjust the temperature and airflow to maintain a comfortable level. Cool: The car will blow cool air into the car. Heat: The car will blow warm air into the car. Defrost: The car will blow warm air onto the windshield to defrost it.\"}\n",
        "DOCUMENT2 = {\n",
        "    \"title\": \"Touchscreen\",\n",
        "    \"content\": \"Your Googlecar has a large touchscreen display that provides access to a variety of features, including navigation, entertainment, and climate control. To use the touchscreen display, simply touch the desired icon.  For example, you can touch the \\\"Navigation\\\" icon to get directions to your destination or touch the \\\"Music\\\" icon to play your favorite songs.\"}\n",
        "DOCUMENT3 = {\n",
        "    \"title\": \"Shifting Gears\",\n",
        "    \"content\": \"Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position.  Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions.\"}\n",
        "\n",
        "documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WwhCQwPbvwc-"
      },
      "source": [
        "Organize the contents of the dictionary into a dataframe for better visualization."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "id": "GJKLIW9Z31Vf"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Title</th>\n",
              "      <th>Text</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Operating the Climate Control System</td>\n",
              "      <td>Your Googlecar has a climate control system th...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Touchscreen</td>\n",
              "      <td>Your Googlecar has a large touchscreen display...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>Shifting Gears</td>\n",
              "      <td>Your Googlecar has an automatic transmission. ...</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                  Title  \\\n",
              "0  Operating the Climate Control System   \n",
              "1                           Touchscreen   \n",
              "2                        Shifting Gears   \n",
              "\n",
              "                                                Text  \n",
              "0  Your Googlecar has a climate control system th...  \n",
              "1  Your Googlecar has a large touchscreen display...  \n",
              "2  Your Googlecar has an automatic transmission. ...  "
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "import pandas as pd\n",
        "\n",
        "df = pd.DataFrame(documents)\n",
        "df.columns = ['Title', 'Text']\n",
        "df"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LHonPYEwStLB"
      },
      "source": [
        "Get the embeddings for each of these bodies of text. Add this information to the dataframe."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "id": "4SOhy0lNBhfN"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Title</th>\n",
              "      <th>Text</th>\n",
              "      <th>Embeddings</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Operating the Climate Control System</td>\n",
              "      <td>Your Googlecar has a climate control system th...</td>\n",
              "      <td>[0.02483931, -0.003871694, 0.013593362, -0.031...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Touchscreen</td>\n",
              "      <td>Your Googlecar has a large touchscreen display...</td>\n",
              "      <td>[0.008149438, -0.0013574613, -0.0029458047, -0...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>Shifting Gears</td>\n",
              "      <td>Your Googlecar has an automatic transmission. ...</td>\n",
              "      <td>[0.009464946, 0.022619268, -0.0036155856, -0.0...</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                  Title  \\\n",
              "0  Operating the Climate Control System   \n",
              "1                           Touchscreen   \n",
              "2                        Shifting Gears   \n",
              "\n",
              "                                                Text  \\\n",
              "0  Your Googlecar has a climate control system th...   \n",
              "1  Your Googlecar has a large touchscreen display...   \n",
              "2  Your Googlecar has an automatic transmission. ...   \n",
              "\n",
              "                                          Embeddings  \n",
              "0  [0.02483931, -0.003871694, 0.013593362, -0.031...  \n",
              "1  [0.008149438, -0.0013574613, -0.0029458047, -0...  \n",
              "2  [0.009464946, 0.022619268, -0.0036155856, -0.0...  "
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Get the embeddings of each text and add to an embeddings column in the dataframe\n",
        "def embed_fn(title, text):\n",
        "  response = client.models.embed_content(\n",
        "        model=EMBEDDING_MODEL_ID,\n",
        "        contents=text,\n",
        "        config=types.EmbedContentConfig(\n",
        "            task_type=\"retrieval_document\",\n",
        "            title=title\n",
        "        )\n",
        "    )\n",
        "\n",
        "  return response.embeddings[0].values\n",
        "\n",
        "df['Embeddings'] = df.apply(lambda row: embed_fn(row['Title'], row['Text']), axis=1)\n",
        "df"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cfm8a31FKd00"
      },
      "source": [
        "## Document search with Q&A\n",
        "\n",
        "Now that the embeddings are generated, let's create a Q&A system to search these documents. You will ask a question about hyperparameter tuning, create an embedding of the question, and compare it against the collection of embeddings in the dataframe.\n",
        "\n",
        "The embedding of the question will be a vector (list of float values), which will be compared against the vector of the documents using the dot product. This vector returned from the API is already normalized. The dot product represents the similarity in direction between two vectors.\n",
        "\n",
        "The values of the dot product can range between -1 and 1, inclusive. If the dot product between two vectors is 1, then the vectors are in the same direction. If the dot product value is 0, then these vectors are orthogonal, or unrelated, to each other. Lastly, if the dot product is -1, then the vectors point in the opposite direction and are not similar to each other.\n",
        "\n",
        "Note, with the new embeddings model (`gemini-embedding-001`), specify the task type as `QUERY` for user query and `DOCUMENT` when embedding a document text.\n",
        "\n",
        "Task Type | Description\n",
        "---       | ---\n",
        "RETRIEVAL_QUERY\t| Specifies the given text is a query in a search/retrieval setting.\n",
        "RETRIEVAL_DOCUMENT | Specifies the given text is a document in a search/retrieval setting."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "id": "80w2VQQ9JWcU"
      },
      "outputs": [],
      "source": [
        "query = \"How to shift gears in the Google car?\"\n",
        "\n",
        "request = client.models.embed_content(\n",
        "    model=EMBEDDING_MODEL_ID,\n",
        "    contents=query,\n",
        "    config=types.EmbedContentConfig(\n",
        "        task_type=\"RETRIEVAL_DOCUMENT\",\n",
        "        )\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iivgDQej5Agt"
      },
      "source": [
        "Use the `find_best_passage` function to calculate the dot products, and then sort the dataframe from the largest to smallest dot product value to retrieve the relevant passage out of the database."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "id": "am36P3J9M6Zv"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "\n",
        "def find_best_passage(query, dataframe):\n",
        "  \"\"\"\n",
        "  Compute the distances between the query and each document in the dataframe\n",
        "  using the dot product.\n",
        "  \"\"\"\n",
        "  query_embedding = client.models.embed_content(\n",
        "      model=EMBEDDING_MODEL_ID,\n",
        "      contents=query,\n",
        "      config=types.EmbedContentConfig(\n",
        "          task_type=\"retrieval_document\",\n",
        "          )\n",
        "  )\n",
        "\n",
        "  dot_products = np.dot(\n",
        "      np.stack(dataframe['Embeddings']),\n",
        "      query_embedding.embeddings[0].values\n",
        "  )\n",
        "  idx = np.argmax(dot_products)\n",
        "  return dataframe.iloc[idx]['Text'] # Return text from index with max value"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Uq-bpLZm9DKo"
      },
      "source": [
        "View the most relevant document from the database:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "id": "1I5lAqdH9zWL"
      },
      "outputs": [
        {
          "data": {
            "text/markdown": [
              "Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position.  Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions."
            ],
            "text/plain": [
              "<IPython.core.display.Markdown object>"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from IPython.display import Markdown\n",
        "\n",
        "passage = find_best_passage(query, df)\n",
        "Markdown(passage)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ebkGT0ha5Ln3"
      },
      "source": [
        "## Question and Answering Application\n",
        "\n",
        "Let's try to use the text generation API to create a Q & A system. Input your own custom data below to create a simple question and answering example. You will still use the dot product as a metric of similarity."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "id": "pqf-OsT3auTm"
      },
      "outputs": [],
      "source": [
        "import textwrap\n",
        "\n",
        "def make_prompt(query, relevant_passage):\n",
        "  escaped = (\n",
        "      relevant_passage\n",
        "      .replace(\"'\", \"\")\n",
        "      .replace('\"', \"\")\n",
        "      .replace(\"\\n\", \" \")\n",
        "  )\n",
        "  prompt = textwrap.dedent(\"\"\"\n",
        "    You are a helpful and informative bot that answers questions using text\n",
        "    from the reference passage included below. Be sure to respond in a\n",
        "    complete sentence, being comprehensive, including all relevant\n",
        "    background information.\n",
        "\n",
        "    However, you are talking to a non-technical audience, so be sure to\n",
        "    break down complicated concepts and strike a friendly and conversational\n",
        "    tone. If the passage is irrelevant to the answer, you may ignore it.\n",
        "\n",
        "    QUESTION: '{query}'\n",
        "    PASSAGE: '{relevant_passage}'\n",
        "\n",
        "    ANSWER:\n",
        "  \"\"\").format(query=query, relevant_passage=escaped)\n",
        "\n",
        "\n",
        "  return prompt"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "id": "mlpDRG3cVvQE"
      },
      "outputs": [
        {
          "data": {
            "text/markdown": [
              "\n",
              "You are a helpful and informative bot that answers questions using text\n",
              "from the reference passage included below. Be sure to respond in a\n",
              "complete sentence, being comprehensive, including all relevant\n",
              "background information.\n",
              "\n",
              "However, you are talking to a non-technical audience, so be sure to\n",
              "break down complicated concepts and strike a friendly and conversational\n",
              "tone. If the passage is irrelevant to the answer, you may ignore it.\n",
              "\n",
              "QUESTION: 'How to shift gears in the Google car?'\n",
              "PASSAGE: 'Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position.  Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions.'\n",
              "\n",
              "ANSWER:\n"
            ],
            "text/plain": [
              "<IPython.core.display.Markdown object>"
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "prompt = make_prompt(query, passage)\n",
        "Markdown(prompt)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qmdYdoIHcEc_"
      },
      "source": [
        "Choose one of the Gemini content generation models in order to find the answer to your query."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "id": "m30avD9cfQQ-"
      },
      "outputs": [],
      "source": [
        "MODEL_ID = \"gemini-2.5-flash\" # @param [\"gemini-2.5-flash-lite\", \"gemini-2.5-flash\", \"gemini-2.5-pro\",\"gemini-3-pro-preview\"] {\"allow-input\":true, isTemplate: true}\n",
        "answer = client.models.generate_content(\n",
        "    model=MODEL_ID,\n",
        "    contents=prompt,\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "id": "COBhn6J9S_xI"
      },
      "outputs": [
        {
          "data": {
            "text/markdown": [
              "Good news! Your Googlecar actually has an automatic transmission, which means shifting gears is super simple – you just move the shift lever to the spot you need! For instance, if you're parked and want the car to stay put, you'll put it in 'Park' because that locks the wheels. When you need to back up, you'll choose 'Reverse.' If you're stopped at a traffic light or in slow traffic and don't want the car to roll, 'Neutral' is the spot; the car won't move unless you press the gas pedal. To drive forward, you'll simply select 'Drive.' And for those times when you're driving in snow or really slippery conditions, there's a 'Low' position to help you out."
            ],
            "text/plain": [
              "<IPython.core.display.Markdown object>"
            ]
          },
          "execution_count": 14,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "Markdown(answer.text)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-ocgBrOEXZbT"
      },
      "source": [
        "## Next steps\n",
        "\n",
        "Check out the [embeddings quickstart](https://github.com/google-gemini/cookbook/blob/main/quickstarts/Embeddings.ipynb) to learn more, and browse the cookbook for more [examples](https://github.com/google-gemini/cookbook/tree/main/examples)."
      ]
    }
  ],
  "metadata": {
    "colab": {
      "name": "Talk_to_documents_with_embeddings.ipynb",
      "toc_visible": true
    },
    "google": {
      "image_path": "/site-assets/images/share.png",
      "keywords": [
        "examples",
        "googleai",
        "samplecode",
        "python",
        "embed"
      ]
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
